#pragma once

#include <google/protobuf/service.h>
#include <muduo/net/TcpServer.h>
#include <muduo/net/TcpConnection.h>
#include <muduo/net/EventLoop.h>
#include <string>
#include <unordered_map>

class RpcProvider
{
public:
    //注册服务
    void NotifyService(google::protobuf::Service *service);
    //运行rpc服务器，使用muduo网络库，设置回调并开启事件循环
    void Run();

private:
    void onConnection(const muduo::net::TcpConnectionPtr &);
    void onMessage(const muduo::net::TcpConnectionPtr &,
                   muduo::net::Buffer *,
                   muduo::Timestamp);
    void done(const muduo::net::TcpConnectionPtr &conn, google::protobuf::Message *response);

    //服务信息:存储服务和服务的方法
    struct ServiceInfo
    {
        google::protobuf::Service *m_service;
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor *> m_methodMap;
    };
    //服务表:存储服务名和服务信息
    std::unordered_map<std::string, ServiceInfo> m_serviceInfoMap;

private:
    muduo::net::EventLoop ev;
};